# -*-coding: utf-8 -*-

'''
	Declaracao de Classe
'''
from classe9 import ColecaoDitadores 
class Cartao:
	'''
		uma classe que representa o conceitp de cartão
	'''
	entidade = ""# uma variavel da classe
	def __init__(self, numero=0):
		"""Construtor"""
		self.numero = numero# uma variavel de instancia
		pass
	
	def __str__(self):
		"""resultado da impressao de um objecto"""
		return "numero {0}".format(self.numero)
	pass

'''
Metodos
'''

def f1(self, x, y):
	return min(x, y)

class C:
	f = f1
obj = C()
print obj.f(2,4)
class Saco:
	def __init__(self):
		self.data = []
		pass
	
	def add(self, x):
		self.data.append(x)
		pass
		
	def add2(self, x):
		self.add(x)
		self.add(x)
		pass
	pass
	
'''
	Alguma informacao sobre as classes
'''
class Fruta:
	"""documentacao da Classe Fruta"""
	def __init__(self, tipo):
		self.tipo = tipo
		pass
	
	def citrino(self, citrus = False):
		"""por defeito __citrus = False"""
		self.__citrus = citrus
		pass
	pass


'''
	Heranca Multipla, Variáveis Privadas e 
	Verificacao de tipoos
'''
class MeioTransporte:
	
	def __init__(self, combustivel="gasolona"):
		self.combustivel = combustivel
		pass
	
	def __str__(self):
		return "combustivel =" + str(self.combustivel)
	pass
	
class Rodas:
	def __init__(self, numero_rodas=4):
		self.numero_rodas = numero_rodas
	def __str__(self):
		return "numero_rodas =" + str(self.numero_rodas)
	pass

class Carro(MeioTransporte, Rodas):
	def __init__(self, combustivel, numero_rodas):
		MeioTransporte.__init__(self, combustivel)
		Rodas.__init__(self, numero_rodas)
	def __str__(self):
		return MeioTransporte.__str__(self) + Rodas.__str__(self)
		
	pass

class MeioTransporte:
	
	def __init__(self, combustivel="gasolona"):
		self.combustivel = combustivel
		self.__privado = True
		pass
	
	def __str__(self):
		return "combustivel =" + str(self.combustivel)
	pass
	
class Carro(MeioTransporte):
	def __init__(self, combustivel):
		MeioTransporte.__init__(self, combustivel)
	def __str__(self):
		return MeioTransporte.__str__(self) 
		
	pass
def main():
	#instancias da classe
	obj1 = Cartao(123456789)
	obj2 = Cartao(7843972)
	Cartao.entidade =  "Governo"
	print obj1, obj1.entidade 
	print obj2, obj2.entidade
	obj = Saco()
	obj.add2("arroz")
	print obj.data
	print Fruta.__doc__
	obj = Fruta("pessego")
	print obj.__class__
	'''
	obj = Carro("gasoleo", 6)
	print obj
	'''
	
	obj = Carro("gasoleo")
	print isinstance(obj, MeioTransporte)
	print issubclass(Carro, MeioTransporte)
	
	try:
		print obj.__privado
		
	except AttributeError:
		print "--privado e uma variavel privada"
	
	pass
	
'''
	Classe derivadas de Novo estilo
'''

class Cartao(object):
	def __init__(self, nome):
		self.nome = nome
		pass
	
	def __str__(self):
		return str(self.nome)

	pass

class CartaoCidadado(Cartao):
	def __init__(self, nome, numero):
		self.numero = numero
		super(CartaoCidadado, self).__init__(nome)
		pass
	pass

class ListaCidadao(list):
	def __str__(self):
		s = ""; c = 0
		for x in self:
			c += 1; s+= "\n" + str(c) + " " + str(x)
		return s
	pass

'''
Excecoes
'''

class ContaBancoEspiritoAngelico:
	 
	def __init__(self, saldoInicial):
		self.saldo = saldoInicial
		pass
	
	def levantamento(self, montante):
		if montante > self.saldo:
			raise ValueError, "nao ha cacau sufeciente..." 
		pass 
	pass

class MeaCulpa:
	def __init__(self, numero):
		self.numero_chicotadas = numero
		pass
	
		def __str__(self):
			return "numero_chicotadas =" +  repr(self.numero_chicotadas)
	pass 

'''
Geradores
'''

def fib(n):
	if n == 0: return 0
	if n == 1: return 1
	return fib(n -1) + fib(n -2)
	
def genfib(n):
	a = 0
	yield a
	b= 1
	yield b
	while b < n:
		a,b = b, a+b
		yield b
	pass 
	
def main():
	#instancias da classe
	obj1 = Cartao(123456789)
	obj2 = Cartao(7843972)
	Cartao.entidade =  "Governo"
	print obj1, obj1.entidade 
	print obj2, obj2.entidade
	obj = Saco()
	obj.add2("arroz")
	print obj.data
	print Fruta.__doc__
	obj = Fruta("pessego")
	print obj.__class__
	'''
	obj = Carro("gasoleo", 6)
	print obj
	'''
	
	obj = Carro("gasoleo")
	print isinstance(obj, MeioTransporte)
	print issubclass(Carro, MeioTransporte)
	
	try:
		print obj.__privado
		
	except AttributeError:
		print "--privado e uma variavel privada"
	
	obj = CartaoCidadado("Eleuterio Coelho", "12345")
	print obj.nome
	lista1 = ListaCidadao()
	lista1.append(Cartao("Ildefonso Coelho"))
	lista1.append(Cartao("Hermenegildo Coelho"))
	conta = ContaBancoEspiritoAngelico(100)
	try:
		massa_no_bolso = conta.levantamento(150)
	except ValueError:
		print "Nao ha levantamentos a descoberto"
	finally:
		print "Va queixar-se ao Banco de Portugal..."
		pass
	
	try:
		trinta_chicotadas = 30
		raise MeaCulpa(30)
	
	except MeaCulpa as excecao:
		print "arggghhh..  ", excecao.numero_chicotadas
	
	'''
	Iteradores
	'''
	colecao = ColecaoDitadores()
	colecao.add("Hitler")
	colecao.add("Mussolini")
	colecao.add("Salazar")
	colecao.add("Idi Amin")
	colecao.add("Stalin")
	colecao.add("Kim Jong II")
	
	for ditador in colecao:
		print ditador
	
	for k in range(7): print fib(k)
	for k in  genfib(8): print k
	
	
	pass 
main()
